package br.uff.es1.facade;

import br.uff.es1.*;
import br.uff.es1.dao.*;
import java.util.ArrayList;
import java.util.Date;

public class DAOFacade {
    protected ClienteDAO clienteDao;
    protected VendedorDAO vendedorDao;
    protected GerenteDAO gerenteDao;
    protected FornecedorDAO fornecedorDao;
    protected LivroDAO livroDao;
    protected CupomDAO cupomDao;
    protected PedidoDAO pedidoDao;
    private static DAOFacade instance;

    private DAOFacade() {
        this.inicializarDaos();
    }
    
     public static DAOFacade getInstance(){
           if (instance == null) {
               instance = new DAOFacade();
           }

           return instance;
     }    
    
    public void inicializarDaos(){        
        this.clienteDao = new ClienteDAO();
        this.vendedorDao = new VendedorDAO();
        this.gerenteDao = new GerenteDAO();
        this.fornecedorDao = new FornecedorDAO();
        this.livroDao = new LivroDAO();   
        this.cupomDao = new CupomDAO();
        this.pedidoDao = new PedidoDAO();
    }
    
    public boolean inserirCliente(String nome, String cpf, String endereco, String telefone){
        return this.clienteDao.inserir(nome, cpf, endereco, telefone);        
    }
    
    public boolean inserirVendedor(String nome, String cpf, String login, String senha){
        return this.vendedorDao.inserir(nome, cpf, login, senha);
    }
    
    public boolean inserirGerente(String nome, String cpf, String login, String senha){
        return this.gerenteDao.inserir(nome, cpf, login, senha);
    }
    
    public boolean inserirFornecedor(String nome, String cnpj, String endereco, String telefone){
        return this.fornecedorDao.inserir(nome, cnpj, endereco, telefone);
    }
    
    public boolean inserirLivro(String titulo, Date dataCadastro, int edicao, String autores, String editora, String codigoBarras, double preco, int quantidade, int idFornecedor){
        return this.livroDao.inserir(titulo, dataCadastro, edicao, autores, editora, codigoBarras, preco, quantidade, idFornecedor);
    }
    
    public int inserirCupom(double valor){
        return this.cupomDao.inserir(new Date(), valor);
    }
    
    public int inserirPedido(Date data, int idClient){
        return this.pedidoDao.criarPedido(data, idClient);
    }
    
    public void incrementarQuantidadeLivro(int idLivro, int qtdLivro){
        this.livroDao.incrementarQuantidadeLivro(idLivro, qtdLivro);
    }
    
    public void decrementarQuantidadeLivro(int idLivro){
        this.livroDao.decrementarQuantidadeLivro(idLivro);
    }
    
    public int pegaIdLivroPorCodigo(String codigo){
        return this.livroDao.pegarIdLivroPorCodigo(codigo);
    }
    
    public int obterQuantidadeEstoque(String Codigo){
        return this.livroDao.obterQuantidadeEstoque(Codigo);
    }
    
    public ArrayList<Cliente> obterTodosClientes(){
        return this.clienteDao.obterTodos();
    }
    
    public ArrayList<Livro> obterTodosLivros(){
        return this.livroDao.obterTodos();
    }    
    
    public ArrayList<Pedido> obterTodosPedidos(){
        return this.pedidoDao.obterTodos();
    }    
    
    public Cliente buscarClientePorCPF(String cpf){
        return this.clienteDao.buscarPorCPF(cpf);
    }
    
    public Fornecedor buscarFornecedorPorCNPJ(String cnpj){
        return this.fornecedorDao.buscarPorCNPJ(cnpj);
    }    
    
    public Gerente buscarGerentePorCPF(String cpf){
        return this.gerenteDao.buscarPorCPF(cpf);
    }    
    
    public Vendedor buscarVendedorPorCPF(String cpf){
        return this.vendedorDao.buscarPorCPF(cpf);
    }      
    
    public Livro obterLivro(String codigoBarras){
        return this.livroDao.buscarPorCodigo(codigoBarras);
    }
    
    public Vendedor obterVendedorPeloLogin(String login){
        return this.vendedorDao.obterVendedorPeloLogin(login);
    }
    
    public Gerente obterGerentePeloLogin(String login){
        return this.gerenteDao.obterGerentePeloLogin(login);
    }    
    
    public int obterIDCliente(String nome){
        return this.clienteDao.pegarIdCliente(nome);
    }
    
    
    public int obterIDFornecedor(String cnpj){
        return this.fornecedorDao.pegarIdFornecedor(cnpj);
    }
    
    public int obterIDLivro(String titulo){
        return this.livroDao.pegarIdLivro(titulo);
    }
    
    public Pedido obterPedido(int numeroNota){
        return this.pedidoDao.obterPedido(numeroNota);
    }
    
    public Cupom obterCupom(int numeroCupom){
        return this.cupomDao.buscar(numeroCupom);
    }
    
    public boolean adicionarItemPedido(int numNota, ItemPedido item){
        return this.pedidoDao.adicionarItemPedido(numNota, item);
    }
    
    public void adicionarCupomPedido(int numeroNota, Cupom cupom){
        this.pedidoDao.adicionarCupomPedido(numeroNota, cupom);
    }
    
    public boolean verificaCupom(int idCupom){
        return this.cupomDao.validaCupom(idCupom);
    }
    

}
